home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / graphic / tweak16b.zip / REGTABLE.CPP < prev    next >
C/C++ Source or Header  |  1993-11-27  |  3KB  |  124 lines

  1. /*
  2.     RegTable.CPP version 1.0
  3.     by Robert Schmidt of Ztiff Zox Softwear 1993
  4.     
  5.     Defines the member and friend functions of the RegisterTable class
  6.         declared in RegTable.HPP.
  7. */
  8.  
  9. #include <dos.h>
  10. //#include <conio.h>
  11. #include "RegTable.hpp"
  12.  
  13.  
  14. RegisterTable::RegisterTable(istream &ins)
  15.     {
  16.     // Read number of registers (first number in file)
  17.     ins >> registers;
  18.     // Allocate enough space
  19.     reg = new NamedRegister[registers];
  20.     // Read reg. descriptions
  21.     for (int i=0; i<registers; i++)
  22.         ins >> reg[i];
  23.     // Get current register configuration from VGA, and use as default
  24.     in();
  25.     }
  26.  
  27.  
  28. void RegisterTable::in()
  29.     {
  30.     for (int r = 0; r < registers; r++)
  31.         reg[r].in();
  32.     }
  33.  
  34. void RegisterTable::out()
  35.     {
  36.     outportb(0x3d4,0x11);                // Ensure CRT regs. 0-7 are writable!
  37.     int v = inportb(0x3d5);                //    That is, clear bit 7 of port
  38.     v &= 0x7f;                            //    0x3D4, index 0x11.
  39.     outport(0x3d4,0x11 | (v << 8));
  40.  
  41. //    outport(0x3c4, 0x0100);                // reset sequencer
  42.  
  43.     for (int r = 0; r < registers; r++)
  44.         if (reg[r].isEnabled())
  45.             reg[r].out();
  46.  
  47. //    outport(0x3c4, 0x0300);                // re-reset sequencer
  48.     outportb(0x3c0, 0x20);                // Reenable display data
  49.     }
  50.  
  51. /*
  52.     This istream operator >> reads an entire table of Register values
  53.     into 'this' table.
  54.     Notes:
  55.         The stream is read until good() is no longer true.  Not good
  56.             practice, but hey!
  57.         If the read Register's port and index pair is not found in 'this'
  58.             table, it is ignored.
  59.         In effect, only the *values* in the table may change after >>,
  60.             not port or index numbers.
  61. */
  62.  
  63. istream& operator>> (istream &in, RegisterTable &t)
  64.     {
  65.     int r = 0;
  66.     t.doDisable();                            // first disable all registers
  67.     while (in.good())
  68.         {
  69.         Register temp;
  70.         in >> temp;
  71.     
  72.         int prevr = r;
  73.     
  74.         //Search for the correct register position:
  75.         while (temp.getPort() != t.reg[r].getPort() ||
  76.             temp.getIndex() != t.reg[r].getIndex())
  77.             {
  78.             if (++r >= t.registers)
  79.                 r = 0;
  80.             if (r == prevr)                    // Have we looped around once?
  81.                 goto skip;                    //    Register not supported!
  82.             }
  83.         // Correct register found, now store the value and enable it.
  84.         t.reg[r].setValue(temp.getValue());
  85.         t.reg[r].doEnable();                // enable this single register
  86.     skip:
  87.         }
  88.     return in;
  89.     }
  90.  
  91.  
  92. //    This operator << sends all enabled registers in t to the out stream.
  93.  
  94. ostream& operator<< (ostream &out, RegisterTable &t)
  95.     {
  96.     for (int r = 0; r < t.registers; r++)
  97.         if (t.reg[r].isEnabled())
  98.             out << Register(t.reg[r]);
  99.     return out;
  100.     }
  101.  
  102. void RegisterTable::doEnable()
  103.     {
  104.     for (int r=0; r<registers; r++)
  105.         reg[r].doEnable();
  106.     }
  107.  
  108. void RegisterTable::doDisable()
  109.     {
  110.     for (int r=0; r<registers; r++)
  111.         reg[r].doDisable();
  112.     }
  113.  
  114.  
  115. Register *RegisterTable::getRegister(unsigned p, unsigned char i)
  116.     {
  117.     for (int r = 0; r < registers; ++r)
  118.         if (reg[r].getPort() == p && reg[r].getIndex() == i)
  119.             return ®[r];
  120.     return 0;
  121.     }
  122.  
  123.  
  124.